//
//  ZYStatus.swift
//  weibo007
//
//  Created by 陈宗毅 on 15/12/20.
//  Copyright © 2015年 czy. All rights reserved.
//

import UIKit
import SDWebImage
class ZYStatus: NSObject {
    
    ///定义模型属性
    //MARK - 表示属性
    //创建时间
    var created_at:String?
    ///微博id
    var id:Int = 0
    
    ///微博正文内容
    var text:String?
    
    ///来源
    var source :String?
    ///微博的配图 [String:AnyObject]，///数组里面的元素是字典
    var pic_urls:[[String:AnyObject]]? {
        
        didSet {
        
            let count = pic_urls?.count ?? 0
            if count == 0 {
                //没有图片
                return
            }
            
            //有图片
            //创建数组保存到的NSURL
            storePictureURLs = [NSURL]()
            
            //遍历所有字典
            for dict in pic_urls!
            {
                
                //取出字典的value，转成NSURL，
               let urlString =  dict["thumbnail_pic"] as! String
                let url = NSURL(string: urlString)!
            
                storePictureURLs?.append(url)
                
            }
        }
    }
    

    ///微博配图的NSURL数组
    var storePictureURLs:[NSURL]?
    
    /// 如果是原创微博显示原创微博的图片,如果是转发微博显示转发微博的图片
    var pictureURLs:[NSURL]?{
        
        return retweeted_status == nil ?storePictureURLs :
        retweeted_status?.storePictureURLs
    
    }

    ///转发数
    var reposts_count:Int = 0
    ///评论数
    var comments_count:Int = 0
    ///表态数
    var attitudes_count:Int = 0
    
    var user:ZYUser?
    
    var retweeted_status:ZYStatus?
 
    var rowHeight: CGFloat?
    
    /// 返回cell的缓存标识,根据不同模型返回不同的缓存标识
    func cellID() -> String {
        // 判断是原创的模型,还是转发的模型.根据retweeted_status来判断
        // 如果retweeted_status有值,是一个转发微博
        // 如果retweeted_status没有值,是一个原创微博
    
        return retweeted_status == nil ? ZYStatusCellReuseIdentifier.StatusNormalCell.rawValue : ZYStatusCellReuseIdentifier.StatusForwardCell.rawValue
        
    }
    
    //字典转模型
    init(dict:[String:AnyObject]){
        super.init()
        //在init之前能赋值的，就可以不加？
        //使用kvc赋值所有属性,kvc是一个方法，只有对象初始化完毕之后才能调用
        setValuesForKeysWithDictionary(dict)
    }
    
    //3.字典的key在模型找不到对应的属性，需要实现
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    override func setValue(value: AnyObject?, forKey key: String) {
//        print("key：\(key)")
        //判断如果是user这个key,我们自己来字典转模型,不需要kvc
        if key == "user"{
            //字典转模型
            if let dict = value as? [String:AnyObject]{
                let userModel = ZYUser(dict: dict)
                //将模型赋值给user属性
                self.user = userModel
            }
            
            //一定要记得return
            return
        }
        
        if key == "retweeted_status" {
            //我们自己字典转模型
            if let dict = value as? [String:AnyObject] {
                retweeted_status = ZYStatus(dict: dict)
                print("碰到被转发的微博：\(retweeted_status)")
                
            }
            return
        }
        
        
        super.setValue(value, forKey: key)
    }
    
    
    
    //4.实现description属性
    override var description:String{
       let prop = ["created_at","id","text","source","pic_urls","reposts_count","comments_count","attitudes_count","user","retweeted_status"]
        //通过一个数组生成一个字典，数组中的元素会成为字典的key,key所对应的value会从这个模型中来找对应的属性值
      let dict =   dictionaryWithValuesForKeys(prop)
       // \n换行  \t table键
        return "\n\t微博模型:\(dict)"
        
    }
    //MARK: - 加载微博数据
   class func mLoadStatus(since_id: Int, max_id: Int, finished:(statuses:[ZYStatus]?,error:NSError?)->()){
        //直接调用工具类的方法加载微博数据
        ZYNetworkTool.shareInstance.loadStatus (since_id,max_id: max_id){ (result, error) -> () in
            //1.判断是否有数据
            if error != nil || result == nil{
                //没有加载到数据
                //调用闭包
                finished(statuses: nil, error: error)
                return
            }
            //没有错误，有数据
            //字典转模型，判断字典是否有statuses,将statuses转成数组，数组里面存放的是字典
            if  let array = result?["statuses"] as? [[String:AnyObject]]{
                //能获取到微博数据
                //创建一个数组，来存放转好的模型
                var statuses = [ZYStatus]()
                //遍历数组，获取到字典，字典转模型
                
                for dict in array {
                    //获取到字典，字典转模型
                  let status =   ZYStatus(dict: dict)
                    statuses.append(status)
                }
                //所有模型都转换完成，告诉调用的人有微博数据
                cacheWebImage(statuses, finished: finished)
            }else
            {
                finished(statuses: nil, error: nil)
            }
            
        }
    }
    
    /// 类方法只能调用类方法,不能调用对象方法
    /// 缓存图片
    class func cacheWebImage(statuses:[ZYStatus],finished:(statuses:[ZYStatus]?,error:NSError?) -> ())
        {
            //缓存图片的大小
            var length = 0.0
            //创建任务组
            let group = dispatch_group_create()
            
            //1.遍历所有模型
            for status in statuses
            {
                //判断模型是否有图片
                guard let urls = status.pictureURLs else
                {
                    //没有图片要缓存，跳到下一个模型
                    continue
                }
                //有图片，遍历缓存所有图片
                if urls.count == 1{
                        let url = urls[0]
                
                    // SDWebImageManager缓存图片.是一个异步的任务
                    // 在异步任务之前进入组
                    dispatch_group_enter(group)
                    SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                        // 只有异步任务完成就离开组
                        dispatch_group_leave(group)
                        
                        if error != nil {
                            print("缓存图片失败：\(url)")
                            return
                        }
                        print("缓存图片成功：\(url)")
                        
                        let data = UIImagePNGRepresentation(image)!
                        length += Double(data.length)
                    })
                }
                
            }
            
        //所有的异步任务完成后再来执行
            dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
                print("所有图片下载完成，大小为：\(length/1024/1024)")
                //通知别人，获取到所有的微博，调用闭包
                finished(statuses: statuses, error: nil)
            }
    }
    
    
}
